package edu.cebanc.spring.biblioteca.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import edu.cebanc.spring.biblioteca.bean.AutorBean;
import edu.cebanc.spring.biblioteca.bean.BajaBean;
import edu.cebanc.spring.biblioteca.bean.EditorialBean;
import edu.cebanc.spring.biblioteca.bean.EjemplarBean;
import edu.cebanc.spring.biblioteca.bean.GeneroBean;
import edu.cebanc.spring.biblioteca.bean.IdiomaBean;
import edu.cebanc.spring.biblioteca.bean.LibroBean;
import edu.cebanc.spring.biblioteca.dao.AutoresDAO;
import edu.cebanc.spring.biblioteca.dao.EditorialesDAO;
import edu.cebanc.spring.biblioteca.dao.EjemplaresDAO;
import edu.cebanc.spring.biblioteca.dao.GenerosDAO;
import edu.cebanc.spring.biblioteca.dao.IdiomasDAO;
import edu.cebanc.spring.biblioteca.dao.LibrosDAO;
import edu.cebanc.spring.biblioteca.domain.Autor;
import edu.cebanc.spring.biblioteca.domain.Ejemplar;
import edu.cebanc.spring.biblioteca.domain.Genero;
import edu.cebanc.spring.biblioteca.domain.Libro;
import edu.cebanc.spring.biblioteca.util.DataParser;

@Service("librosService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class LibrosServiceImpl implements LibrosService {

	@Autowired
	EjemplaresDAO ejemplaresDAO;
	@Autowired
	LibrosDAO librosDAO;
	@Autowired
	AutoresDAO autoresDAO;
	@Autowired
	GenerosDAO generosDAO;
	@Autowired 
	EditorialesDAO editorialesDAO;
	@Autowired
	IdiomasDAO idiomasDAO;
	
	
	@Override
	public List<LibroBean> listadoLibros() {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		return dp.fromLibrolListToLibroBeanList(librosDAO.listLibros());
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void guardarLibro(LibroBean libro) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		librosDAO.saveLibro(dp.fromLibroBeanToLibro(libro));
	}

	@Override
	public LibroBean cargarLibro(String id) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		return dp.fromLibroToLibroBean(librosDAO.getLibro(Integer.parseInt(id)));
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void eliminarLibro(String id) {
		// TODO Auto-generated method stub
		
		librosDAO.deleteLibro(librosDAO.getLibro(Integer.parseInt(id)));
	}

	@Override
	public List<AutorBean> getAutores(LibroBean libro) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		List<Autor> aux = autoresDAO.getAutores();
		for(int i = 0; i < aux.size(); i++){
			Autor aut = (Autor)aux.get(i);
			for(int j = 0; j < libro.getAutores().size(); j++){
				if(aut.getId_autor() == libro.getAutores().get(j).getId_autor()){
					aux.remove(aut);
				}
			}
		}
		
		return dp.fromAutorListToAutorBeanList(aux);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void addAutorToLibro(LibroBean libro, AutorBean autor) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();

		//libro.getAutores().add(dp.fromAutorToAutorBean());
		Libro aux = dp.fromLibroBeanToLibro(libro);
		aux.getAutores().add(autoresDAO.getAutor(autor.getId_autor()));
		librosDAO.saveLibro(aux);
	}

	@Override
	public List<GeneroBean> getGeneros(LibroBean libro) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		List<Genero> aux = generosDAO.listGeneros();
		for(int i = 0; i < aux.size(); i++){
			Genero gen = (Genero) aux.get(i);
			for(int j = 0; j < libro.getGeneros().size(); j++){
				if(gen.getId_genero() == libro.getGeneros().get(j).getId_genero()){
					aux.remove(gen);
				}
			}
		}
		
		return dp.fromGeneroListToGeneroBeanList(aux);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void addGeneroToLibro(LibroBean libro, GeneroBean genero) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		//libro.getGeneros().add(dp.fromGeneroToGeneroBean());
		Libro aux = dp.fromLibroBeanToLibro(libro);
		aux.getGeneros().add(generosDAO.getGenero(genero.getId_genero()));
		librosDAO.saveLibro(aux);
	}
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void addEjemplarToLibro(LibroBean libro, EjemplarBean ejemplar) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		//libro.getGeneros().add(dp.fromGeneroToGeneroBean());
		Libro aux = dp.fromLibroBeanToLibro(libro);
		Ejemplar auxEje = dp.fromEjemplarBeanToEjemplar(ejemplar);
		auxEje.setEstado("disponible");
		auxEje.setEditorial(editorialesDAO.getEditorial(ejemplar.getEditorial().getId_editorial()));
		auxEje.setIdioma(idiomasDAO.getIdioma(ejemplar.getIdioma().getId_idioma()));
		aux.getEjemplares().add(auxEje);
		librosDAO.saveLibro(aux);
	}

	@Override
	public List<EditorialBean> getEditoriales() {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		return dp.fromEditorialListToEditorialBeanList(editorialesDAO.listEditoriales());
	}

	@Override
	public List<IdiomaBean> getIdiomas() {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		return dp.fromIdiomaListToIdiomaBeanList(idiomasDAO.listIdiomas());
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void deleteAutorLibro(LibroBean libro, String id_autor) {
		// TODO Auto-generated method stub
		Libro lib = librosDAO.getLibro(libro.getId_libro());
		lib.getAutores().remove(autoresDAO.getAutor(Integer.parseInt(id_autor)));
		librosDAO.saveLibro(lib);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void deleteGeneroLibro(LibroBean libro, String id_genero) {
		// TODO Auto-generated method stub
		Libro lib = librosDAO.getLibro(libro.getId_libro());
		lib.getGeneros().remove(generosDAO.getGenero(Integer.parseInt(id_genero)));
		librosDAO.saveLibro(lib);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void bajaEjemplarLibro(BajaBean baja) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		Ejemplar ej = ejemplaresDAO.getEjemplar(baja.getId_ejemplar());
		ej.setBaja(dp.fromBajaBeanToBaja(baja));
		ej.setEstado("baja");
		ejemplaresDAO.updateEjemplar(ej);
	}

	@Override
	public EjemplarBean cargarEjemplar(String id) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		
		return dp.fromEjemplarToEjemplarBean(ejemplaresDAO.getEjemplar(Integer.parseInt(id)));
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void updateEjemplar(EjemplarBean ejemplar) {
		// TODO Auto-generated method stub
		DataParser dp = new DataParser();
		Ejemplar ejem = dp.fromEjemplarBeanToEjemplar(ejemplar);
		ejem.setEditorial(editorialesDAO.getEditorial(ejemplar.getEditorial().getId_editorial()));
		ejem.setIdioma(idiomasDAO.getIdioma(ejemplar.getIdioma().getId_idioma()));
		
		ejemplaresDAO.updateEjemplar(ejem);
	}

}
